/*
 * @Author: 梓岄 3049738225@qq.com
 * @Date: 2025-11-30 19:59:31
 * @LastEditors: 梓岄 3049738225@qq.com
 * @LastEditTime: 2025-11-30 20:33:54
 * @FilePath: /signalSaving/testsig.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include<iostream>
#include<signal.h>
#include<unistd.h>


void PrintPending(sigset_t& pending)
{
    for(int signo=31;signo>0;signo--)
    {
        if(sigismember(&pending,signo))
        {
            std::cout<<"1";
        }
        else
        {
            std::cout<<"0";
        }
    }
    std::cout<<std::endl;
}


void handler(int signo)
{
    std::cout<<"------------------------entry handler"<<std::endl;
    sigset_t pending;
    sigemptyset(&pending);
    //获取pending表
    if(sigpending(&pending)==-1)
    {
        perror("sigpending 1");
        exit(1);
    }
    PrintPending(pending);
    std::cout<<"处理完成："<<signo<<std::endl;//更改2号的默认终止行为，改为打印
    std::cout<<"------------------------leave handler"<<std::endl;
}


int main()
{
    //0.捕捉2号信号
    signal(2,handler);

    //1.屏蔽2号信号
    sigset_t block_set,old_set;
    sigemptyset(&block_set);
    sigemptyset(&old_set);

    // for(int i=1;i<32;i++)
    //     sigaddset(&block_set,i);

    sigaddset(&block_set,2);

    if(sigprocmask(SIG_SETMASK,&block_set,&old_set)==-1)
    {
        perror("sigprocmask 1");
        exit(2);
    }

    std::cout<<"我的pid: "<<getpid()<<std::endl;

    int cnt=1;
    while(true)
    {
        sigset_t pending;
        sigemptyset(&pending);
        //2.获取pending表
        if(sigpending(&pending)==-1)
        {
            perror("sigpending 2");
            exit(1);
        }
        //3.打印pending表
        PrintPending(pending);

        if(cnt==20)
        {
            //4.解除对2号信号的屏蔽
            std::cout<<"解除对2号信号的屏蔽"<<std::endl;
            if(sigprocmask(SIG_SETMASK,&old_set,nullptr)==-1)
            {
                perror("sigprocmask 2");
                exit(2);
            }
        }
        cnt++;
        sleep(1);
    }

    return 0;
}